package com.alison.sink

import org.apache.spark.sql.SparkSession

object E2_sink_file {

  """
    |file sink
    |1，基本介绍
    |（1）file sink 用于将流式处理结果写入文件系统。它允许我们将流数据输出到本地文件系统或分布式文件系统（如 HDFS）中。支持的数据格式有 text、csv、json、parquet、orc 等。
    |（2）file sink 仅支持 Append 输出模式。
    |
    |""".stripMargin

  def main(args: Array[String]): Unit = {
    out_file
  }

  def out_file() = {
    // 创建 SparkSession
    val spark = SparkSession.builder()
      .appName("HelloStructuredStreaming")
      .master("local[*]")
      .getOrCreate()

    // 导入隐式转换
    import spark.implicits._

    // 创建一个流式DataFrame，这里从Socket读取数据
    val lines = spark.readStream
      .format("socket")
      .option("host", "192.168.56.104")
      .option("port", 9999)
      .load()

    // 反转单词
    val words = lines.as[String].flatMap(line => {
      line.split("\\W+").map(word => {
        (word, word.reverse)
      })
    }).toDF("原单词", "反转单词")

    // 启动查询, 把结果输出至文件
    val query = words.writeStream
      .outputMode("append")
      .format("json") // 支持 "orc", "json", "csv"等
//      .option("path", "./output") // 输出目录
      .option("path", "file:///D:\\workspace\\lab\\learnbigdata\\learnspark\\structstream\\src\\main\\resources\\output") // 输出目录
//      .option("checkpointLocation", "./ck1") // 必须指定 checkpoint 目录
      .option("checkpointLocation", "file:///D:\\workspace\\lab\\learnbigdata\\learnspark\\structstream\\src\\main\\resources\\ck1")
      .start()

    // 等待应用程序终止
    query.awaitTermination()

    //关闭 Spark
    spark.stop()
  }
}
